package peace.htmllooker
{
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.StyleSheet;

import peace.data.Constraints;
import peace.gui.layout.Align;
import peace.gui.layout.Valign;

public class Node extends Sprite
{
	/**
	 * минимальные размеры 
	 */	
	public var minWidth:Number;
	public var minHeight:Number;
	/**
	 * рекомендовынные размеры (обычно тупо полный размер контента узла)
	 */	
	public var preferredWidth:Number;
	public var preferredHeight:Number;
	/**
	 * пользовательские размеры (указанные явно)
	 */	
	public var explicitWidth:Number;
	public var explicitHeight:Number;
	/**
	 * размеры в процентах от родительских 
	 */	
	public var percentWidth:Number;
	public var percentHeight:Number;
	
	/**
	 * стили 
	 */		
	public var padding:Constraints = new Constraints();
	public var margin:Constraints = new Constraints();
	
	public var hasBorder:Boolean = false;
	public var borderColor:Number = 0x000000;
	public var borderThickness:Number = 1;
	
	public var hasBackground:Boolean = false;
	public var backgroundColor:Number = 0xffffff;

	public var align:String = Align.LEFT;
	public var valign:String = Valign.TOP;

	protected var background:Shape = new Shape();

	/**
	 * суммарные размеры отступов (паддинг + маржин) 
	 */	
	public function get shellWidth():Number
	{
		return padding.left + padding.right + margin.left + margin.right;
	}
	public function get shellHeight():Number
	{
		return padding.top + padding.bottom + margin.top + margin.bottom;
	}
	
	/**
	 * 
	 * @param xml xml-узел элемента
	 * @param css общий цсс
	 * 
	 */	
	public function Node(xml:XML, css:StyleSheet)
	{
		super();
		init(xml, css);
	}
	/**
	 * virtual 
	 * 
	 */	
	protected function init (xml:XML, css:StyleSheet):void
	{
		addChildAt(background, 0);
		arrange();
	}
	/**
	 * virtual
	 * выравнивание контента  
	 */	
	public function arrange ():void
	{
		var c:DisplayObject = content;
		c.x = margin.left + padding.left;
		c.y = margin.top + padding.top;
		
		redrawBackground ();
	}
	/**
	 * virtual 
	 * @return контент узла
	 * 
	 */	
	public function get content ():DisplayObject
	{
		throw new Error("нужно переопределить ссука!")
	}
	/**
	 * 
	 * @return parent Box
	 * 
	 */	
	public function get parentBox ():Box
	{
		// parent в лучшем случае - контейнер Бокса
		return (parent && parent.parent && parent.parent is Box) ? Box (parent.parent) : null;
	}
	/**
	 * 
	 * @return корневой Htmllooker
	 * 
	 */	
	public function get htmllooker ():Htmllooker
	{
		var box:Box = parentBox;
		if (! box)
		{
			box = Box(this);
		}
		else // ищем корневой 
		{
			for (; box.parentBox!=null; box = box.parentBox) {}
		}
		return Htmllooker(box);
	}
	
	/**
	 * 
	 * @return Browser, если он есть 
	 * 
	 */	
	public function get browser ():Browser
	{
		var l:Htmllooker = htmllooker;
		
		if (l.parent is Browser) return Browser (l.parent);
		// если есть scrollpane
		if (l.parent.parent && l.parent.parent is Browser) return Browser (l.parent.parent);
		
		return null;
	}
	
	

	/**
	 * перерисовываем бордер <br>
	 * для того чтобы он стал видимым, нужно задать graphics.lineStyle
	 */	
	protected function redrawBackground ():void
	{
		background.graphics.clear();
		
		if (hasBorder)
		{
			background.graphics.lineStyle(borderThickness, borderColor, 1, true);
		}
		if (hasBackground)
		{
			background.graphics.beginFill(backgroundColor);
		}
		
		background.graphics.drawRect(margin.left, margin.top, 
			width - margin.left - margin.right, 
			height - margin.top - margin.bottom);
	}
	
	override public function get width():Number
	{
		return content.width + shellWidth;
	}
	override public function set width(value:Number):void
	{
		content.width = value - shellWidth;
	}
	
	override public function get height():Number
	{
		return content.height + shellHeight;
	}
	override public function set height(value:Number):void
	{
		content.height = value - shellHeight;
	}
	/**
	 * Разбираем аттрибут style узла
	 *  
	 * @param value
	 * @return хеш с параметрами стиля 
	 * 
	 */	
	protected function parseStyleAttribute (value:String):Object
	{
		var s:StyleSheet = new StyleSheet();
		s.parseCSS("{" + value + "}");
		return s.getStyle("");
	}
	
	

}
}